/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package bdd;

import exception.AccessErrorException;
import exception.ConnectionBugException;
import exception.DriverBugException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ResourceBundle;

/**
 * Gére la connexion a la base de données.
 * @author Khémon Beh & Florian Minin
 */
public class BDDManager {

    //On va chercher dans le fichier de configuration les données
    //de connexion à la bdd
    private String driver = "org.apache.derby.jdbc.ClientDriver";
    private String bdd = "jdbc:derby://localhost:1527/"+
            ResourceBundle.getBundle("bdd.configurationBDD").getString("bdd");
    private String login = ResourceBundle.getBundle("bdd.configurationBDD").getString("login");
    private String pass = ResourceBundle.getBundle("bdd.configurationBDD").getString("pass");
    private static Connection co = null;

    private BDDManager() throws AccessErrorException{
        try{
            //Charge le pilote
            this.loadDriver();
            //Crée la connection
            co = this.connectBDD();
        }
        //Si driver de la base de données introuvable
        catch (DriverBugException e){
            System.out.println(e.getMessage());
            throw new AccessErrorException(AccessErrorException.DRIVER);
            
        }
        //Si il y a un problème de connexion à la base de données
        catch (ConnectionBugException e){
            throw new AccessErrorException(AccessErrorException.CONNECTION);
        }

    }

    // Méthode statique qui sert de pseudo-constructeur
    /**
     * Instancie la connexion si celle ci ne l'a jamais étée ou retourne l'instance
     * de la connexion.
     * @return <tt>Connection</tt> déjà connectée a la base de données
     * @throws AccessErrorException levée en cas d'erreur d'accés a la base de
     * données
     */
    public static Connection getInstance() throws AccessErrorException {
        //Si il n'y a aucune instance de connexion
        if (co == null) {
            try {
                //On crée une nouvelle instance de la connection qui
                //va nous connecter a la base de données
                new BDDManager();
            } catch (AccessErrorException e) {
                 throw e;
            }
        }
        return co;
    }

    private void loadDriver() throws DriverBugException {
        try{
            Class.forName(driver);
        }
        catch(ClassNotFoundException e){
            System.out.println(e.getCause());
            throw new DriverBugException(DriverBugException.PILOTE_BDD);
        }
    }
    private Connection connectBDD() throws ConnectionBugException {
        try{
            
            co = DriverManager.getConnection(bdd, login, pass);
            System.out.println("Connexion à la BDD");
        }
        catch (SQLException e){
             throw new ConnectionBugException(ConnectionBugException.CO_BDD);
        }
        return co;
    }
    
    /**
     * Déconnecte l'utilisateur de la base de données
     * @throws ConnectionBugException levée en cas d'erreur lors de la fermeture
     * de la connexion.
     */
    public static void deconnectBDD() throws ConnectionBugException {
        try{
            if( co != null && !(co.isClosed())){
                co.close();
                System.out.println("Déconnexion de la base de données");
            }
        }
        catch(SQLException e){
           throw new ConnectionBugException(ConnectionBugException.CLOSE_BDD);
        }
    }

}
